package org.example.licode;

public class String拼接与直接是否地址相同 {
    public static void main(String[] args) {
        String str1="he" +"llo";
        String str2="hello";
        System.out.println(str1==str2);//true

        String str3=new String("hello,world");//在堆里面
        String str4="hello,world";//在常量池中
        System.out.println(str3==str4);//false

        String str5=new String("hello,world");//在堆里面
        String str6=new String("hello,world");//在堆里面
        System.out.println(str5==str6);//false

        String str7=new String("hello,world");
        String str8=str7.intern();
        String str9=str8.intern();
        String str10=str7.intern();
        System.out.println(str8==str10);//true
        System.out.println(str8==str9);//true
        /**
         * 字符数组，用双引号创建的字符串，首先要看字符串中的常量池中有没有这个字符串，如果有直接返回这个字符串，如果没有创建一个字符串，放到常量池中
         */

        /**
         * 字符串常量会不会参与垃圾回收
         * JDK1.8 会，因为垃圾回收的主要区域是堆，在堆里面肯定会被回收，如果字符串常量一直没有被使用，他就会被回收掉
         * JDK1.7 常量池是放在堆中的永久代里面，但是永久代的大小是固定的，这样可能会发生内存溢出的情况
         */
        String  s=new String("xyz");//创建了几个对象
        // 一个或者两个
        /**
         * 如果常量池中有“xyz”的话，只在堆里面创建一个对象，如果常量池中没有xyz,那么需要在堆中创建一个对象放到常量池中，然后再常量池中再创建String对象
         * 此时是两个对象
         */

    }
}
